package cn.dida.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;
/**
 * <p>日期工具类</p>
 * @author lisha
 * @date 2016-11-10 10:43
 * */
public class DateUtils {

	private static Logger logger = Logger.getLogger(DateUtils.class);

	/**
	 * yyyy-MM-dd
	 */
	public static SimpleDateFormat STYLE1 = new SimpleDateFormat("yyyy-MM-dd");
	/**
	 * yyyy/MM/dd
	 */
	public static SimpleDateFormat STYLE2 = new SimpleDateFormat("yyyy/MM/dd");
	/**
	 * yyyy-MM-dd HH:mm:ss
	 */
	public static SimpleDateFormat STYLE3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	/**
	 * yyMMddHHmmss
	 */


	/**
	 * 仅比较年月日 相等
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean isSameDate(Date d1, Date d2) {
		if (d1 == null || d2 == null) {
			logger.debug("isSameDate : 参数有空值，直接返回false");
			return false;
		}
		Calendar c1 = Calendar.getInstance();
		c1.setTime(d1);

		Calendar c2 = Calendar.getInstance();
		c1.setTime(d2);

		return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
				&& c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH)
				&& c1.get(Calendar.DATE) == c2.get(Calendar.DATE);

	}
	/**
	 * 获取本月开始时间
	 * @return
	 */
	public static Date getMonthStart(){
		Calendar calendar=Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date d = calendar.getTime();
        String ds = f.format(d);
        try {
            return f.parse(ds);
        }catch(Exception ex){
        	ex.printStackTrace();
        	return new Date();
        }
	}
	/**
	 * 获取本周开始时间
	 * @return
	 */
	public static Date getWeekStart(){
		Calendar calendar=Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_WEEK, 1);
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date d = calendar.getTime();
        String ds = f.format(d);
        try {
            return f.parse(ds);
        }catch(Exception ex){
        	ex.printStackTrace();
        	return new Date();
        }
	}
	/**
	 * 
	 * getDateAddMinutes:(获取指定时间之后多少分钟的时间). 
	 *
	 * @author sid
	 * @param date
	 * @param minutes
	 * @return
	 */
	public static Date getDateAddMinutes(Date date,int minutes){
		
		Calendar cl = Calendar.getInstance();
		cl.setTime(date);
		cl.add(Calendar.MINUTE	, minutes);
		
		return cl.getTime();
	}

	/**
	 * 保留日期 ，把时间设置为 0 <br>
	 * HOUR_OF_DAY<br>
	 * MINUTE<br>
	 * SECOND<br>
	 * MILLISECOND<br>
	 * 
	 * @param d
	 * @return
	 */
	public static Date clearTime(Date d) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(d);
		ca.set(Calendar.HOUR_OF_DAY, 0);
		ca.set(Calendar.MINUTE, 0);
		ca.set(Calendar.SECOND, 0);
		ca.set(Calendar.MILLISECOND, 0);
		return ca.getTime();
	}

	/**
	 * 增加天数(负值为减)
	 * 
	 * @param d
	 * @param dayToAdd
	 * @return
	 */
	public static Date addDay(Date d, int dayToAdd) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(d);
		ca.add(Calendar.DAY_OF_MONTH, dayToAdd);
		return ca.getTime();
	}

	/**
	 * 是否为"今天"
	 * 
	 * @param d
	 * @return
	 */
	public static boolean isToday(Date d) {
		return isSameDate(d, new Date());
	}

    
    /**
     * 取得今天的日期加最小时间
     * @return
     */
    public static Date getTodayMin() {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date d = new Date();
        String ds = f.format(d);
        try {
            return f.parse(ds);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 取得今天的日期加最大时间
     * @return
     */
    public static Date getTodayMax() {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date d = new Date();
        String ds = f.format(d) + " 23:59:59";
        try {
            f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return f.parse(ds);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     *  将字符串格式的日期转换为Date型的日期<p>
     *
     *  modify by wjz 0326<p>
     *
     *  考虑到日期格式比较复杂，在转换之前先做如下假定：<p>
     *
     *  都是按照年－月－日的格式排列<p>
     *
     *  年都是4位<p>
     *
     *
     *
     *@param  strDate  Description of Parameter
     *@return          Description of the Returned Value
     */
    public static Date strToDate(String strDate) {
        if (strDate == null || strDate.length() < 6) {
            throw new IllegalArgumentException("illeage date format");
        }
        String fmt = "yyyy-MM-dd HH:mm:ss";
        if (strDate.length() == 19) {
            if (strDate.indexOf("-") > 0) {
                fmt = "yyyy-MM-dd HH:mm:ss";
            } else if (strDate.indexOf("/") > 0) {
                fmt = "yyyy/MM/dd HH:mm:ss";
            }
        } else if (strDate.length() == 18) {
            if (strDate.indexOf("-") > 0) {
                fmt = "yyyy-MM-ddHH:mm:ss";
            } else if (strDate.indexOf("/") > 0) {
                fmt = "yyyy/MM/dd HH:mm:ss";
            }
        } else if (strDate.length() == 14) {

            fmt = "yyyyMMddHHmmss";
        } else if (strDate.length() == 10) {
            if (strDate.indexOf("-") > 0) {
                fmt = "yyyy-MM-dd";
            } else if (strDate.indexOf("/") > 0) {
                fmt = "yyyy/MM/dd";
            } else if (strDate.indexOf(".") > 0) {
                fmt = "yyyy.MM.dd";
            }
        } else if (strDate.length() == 8) {
            if (strDate.indexOf("-") > 0) {
                fmt = "yy-MM-dd";
            } else if (strDate.indexOf("/") > 0) {
                fmt = "yy/MM/dd";
            } else if (strDate.indexOf(".") > 0) {
                fmt = "yy.MM.dd";
            } else {
                fmt = "yyyyMMdd";
            }

        }

        SimpleDateFormat formatter = new SimpleDateFormat(fmt);
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }
    
	/**
	 * 日期转换成指定格式的字符串
	 * @param date Date类型日期
	 * @param format 日期格式，如yyyy-MM-dd
	 * @return String 指定格式的时间字符串
	 * @date 2016-12-07 17:14
	 */
	public static String dateToString(Date date, String format) {
		if (date == null) {
			return "";
		}
		if (format == null) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat df = new SimpleDateFormat(format);
		return df.format(date);
	}

	/**
	 * 日期转字符串
	 *  12小时制
	 * @param date
	 * @param format
	 * @return
	 */
	public static String dateToString(Date date) {
		if (date == null) {
			return "";
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		return df.format(date);
	}
	
	/**
	 * 将long类型时间转换成 "yyyy-MM-dd HH:mm:ss"格式的字符串
	 * @param timeInMillis long类型时间
	 * @return String 指定格式的时间字符串
	 * @date 2016-12-06 17:09
	 * */
	public static String formatTimeInMillis(long timeInMillis) {  
	    Calendar cal = Calendar.getInstance();  
	    cal.setTimeInMillis(timeInMillis);  
	    Date date = cal.getTime();  
	    SimpleDateFormat dateFormat = new SimpleDateFormat(  
	            "yyyy-MM-dd HH:mm:ss");  
	    String fmt = dateFormat.format(date);  
	  
	    return fmt;  
	} 
	
	/**
	 *  add by Bill
	 * 日期转字符串
	 *  24小时制
	 * @param date
	 * @param format
	 * @return
	 */
	public static String date24ToString(Date date) {
		if (date == null) {
			return "";
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return df.format(date);
	}

	/**
	 * 日期转时间戳
	 * 
	 * @param date
	 * @return
	 */
	public static long dateToTimeMillis(Date date) {
		if (date == null) {
			return 0;
		}
		return date.getTime() / 1000;
	}
	
	/**
	 * add by Bill
	 * 2011-07-07
	 * @param datestr
	 * @return
	 */
	public static Date StringToDate(String datestr){
		Date dt=null;
		if(datestr==null || "".equals(datestr)){
			dt = new Date();
		}
		try {
			dt = STYLE3.parse(datestr);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return dt;
	}
	

	public static boolean getIsSaleBegin() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, 0);
		Date date = DateUtils.clearTime(calendar.getTime());
		try {
			if (date.compareTo(DateUtils.STYLE3.parse("2012-10-24 00:00:00")) == 0) {
				return true;
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	
	
	public static void main(String [] args){
		try {
			//System.out.println(getTwoDatesMouth("2015-04-06","2014-04-30","yyyy-MM-dd"));
			System.out.println("getIsSaleBegin=="+getIsSaleBegin());

			System.out.println(DateUtils.dateToTimeMillis(new Date())> DateUtils.dateToTimeMillis(DateUtils.STYLE3.parse("2012-08-1 23:59:59")));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	} 
	//时间戳转String
	public static String timeStampToString(Timestamp ts){
		DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	    String tsStr = ""; 
	    tsStr = sdf.format(ts); 
		return tsStr;

	}
	
	 /**
     * 取得某天的日期加最小时间
     * @return
     */
    public static Date getTheDayMin(Date d) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        String ds = f.format(d) + " 00:00:00";
        try {
            f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return f.parse(ds);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 取得某天的日期加最大时间
     * @return
     */
    public static Date getTheDayMax(Date d) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        String ds = f.format(d) + " 23:59:59";
        try {
            f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return f.parse(ds);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 把毫秒转化成日期
     * @param dateFormat 日期格式，例如：MM/ dd/yyyy HH:mm:ss
     * @param millSec 毫秒数
     * @return String 指定格式的时间字符串
     * @date 2016-12-07 17:05
     */
    public static String transferLongToDate(String dateFormat,Long millSec){
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Date date= new Date(millSec);
        return sdf.format(date);
    }
    
    /**
     * 获取当前时间，long型  
     * @return long类型时间
     * @date 2016-12-07 17:05
     * */
    public static long getcurrentTimeLong()  
    {  
        return new Date().getTime();  
    }
    
    /**
     * string类型转换为long类型（strTime的时间格式和formatType的时间格式必须相同）
     * @param strTime 要转换的string类型的时间
     * @param formatType 要转换的日期时间格式，例如yyyy-MM-dd HH:mm:ss 或 yyyy年MM月dd日 HH时mm分ss秒
     * @return long类型日期时间
     * @date 2016-12-09 11:13
     * */
  	public static long stringToLong(String strTime, String formatType)
  			throws ParseException {
  		Date date = stringToDate(strTime, formatType); // String类型转成date类型
  		if (date == null) {
  			return 0;
  		} else {
  			long currentTime = dateToLong(date); // date类型转成long类型
  			return currentTime;
  		}
  	}
 
  	/**
  	 * string类型转换为date类型  （strTime的时间格式必须要与formatType的时间格式相同）
  	 * @param strTime 要转换的string类型的时间
  	 * @param formatType 要转换的日期时间格式，例如yyyy-MM-dd HH:mm:ss 或 yyyy年MM月dd日 HH时mm分ss秒
  	 * @return Date类型日期时间
  	 * @date 2016-12-09 11:11
  	 * */
  	public static Date stringToDate(String strTime, String formatType)
  			throws ParseException {
  		SimpleDateFormat formatter = new SimpleDateFormat(formatType);
  		Date date = null;
  		date = formatter.parse(strTime);
  		return date;
  	}
  
  	
  	/**
  	 * date类型转换为long类型
  	 * @param date Date类型的时间
  	 * @return long类型时间 
  	 * @date 2016-12-09-11:09
  	 * */
  	public static long dateToLong(Date date) {
  		return date.getTime();
  	}
}
